home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / Obrn-A_1.6_lib.lha / oberon-a / source3.lha / source / EAGUI / EASeperators.mod < prev    next >
Text File  |  1995-06-29  |  7KB  |  224 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: EASeperators.mod $
  4.   Description: 3D seperator for EAGUI.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.2 $
  8.       $Author: fjc $
  9.         $Date: 1995/06/04 23:20:20 $
  10.  
  11.   Copyright © 1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. *************************************************************************)
  16.  
  17. <* STANDARD- *>
  18. <*$ StackChk- *>
  19. <*$ LongVars+ *>
  20.  
  21. MODULE EASeperators;
  22.  
  23. IMPORT
  24.   SYS := SYSTEM, Kernel, s := Sets, e := Exec, u := Utility,
  25.   gfx := Graphics, i := Intuition, ea := EAGUI;
  26.  
  27. CONST
  28.  
  29.   (* Rendering flags. *)
  30.  
  31.   Recessed* = 0; (* Draw a recessed line, otherwise draw a raised
  32.                   * one.
  33.                   *)
  34.  
  35. TYPE
  36.  
  37. (* Information that is needed by this object, but that isn't maintained
  38.  * by EAGUI itself.
  39.  *)
  40.  
  41.   SeperatorPtr * = POINTER [2] TO Seperator;
  42.   Seperator * = RECORD [2]
  43.     flags *      : s.SET32;         (* different flags *)
  44.     shinePen *,
  45.     shadowPen *  : e.UBYTE;         (* pens to use *)
  46.   END;
  47.  
  48. VAR
  49.  
  50.   MinSizeHook *, RenderHook * : u.HookPtr;
  51.   hook1, hook2 : u.Hook;
  52.  
  53.  
  54. (*************************************************************************
  55. *                                                                        *
  56. * MinSize Method                                                         *
  57. *                                                                        *
  58. *************************************************************************)
  59.  
  60. PROCEDURE MinSize*
  61.   ( hook : u.HookPtr;
  62.     obj  : ea.OPTR;
  63.     msg  : e.APTR )
  64.   : e.ULONG;
  65.  
  66.   VAR
  67.     minwidth, minheight, type, ignore : LONGINT;
  68.     sep : SeperatorPtr;
  69.     group : ea.OPTR;
  70.  
  71.   BEGIN (* MinSize *)
  72.     (* get a pointer to our structure, and check if we actually got it *)
  73.     sep := SYS.VAL (SeperatorPtr, ea.GetAttr (obj, ea.UserData));
  74.     IF sep # NIL THEN
  75.       (* get the container object *)
  76.       group := SYS.VAL (ea.OPTR, ea.GetAttr (obj, ea.Parent));
  77.       ASSERT (group # NIL, 96);
  78.  
  79.       (* get group type *)
  80.       type := ea.GetAttr (group, ea.Type);
  81.       ASSERT (type IN {ea.TYPE_VGROUP, ea.TYPE_HGROUP}, 96);
  82.  
  83.       IF type = ea.TYPE_VGROUP THEN
  84.         minwidth := 0; minheight := 2
  85.       ELSE
  86.         minwidth := 2; minheight := 0
  87.       END;
  88.  
  89.       (* and finally, we set these values *)
  90.       ignore := ea.SetAttr (obj, ea.MinWidth, minwidth);
  91.       ignore := ea.SetAttr (obj, ea.MinHeight, minheight);
  92.     END;
  93.     (* we always return success *)
  94.     RETURN 0
  95.   END MinSize;
  96.  
  97. (*************************************************************************
  98. *                                                                        *
  99. * Render Method                                                          *
  100. *                                                                        *
  101. *************************************************************************)
  102.  
  103. PROCEDURE Render*
  104.   ( hook : u.HookPtr;
  105.     obj  : ea.OPTR;
  106.     rm   : ea.RenderMessagePtr )
  107.   : e.ULONG;
  108.  
  109.   VAR
  110.     sep : SeperatorPtr;
  111.     width, height, left, top, type, ignore : e.ULONG;
  112.     x1, y1, x2, y2, dx, dy : e.UWORD;
  113.     pen1, pen2 : e.UBYTE;
  114.     group : ea.OPTR;
  115.     recessed : BOOLEAN;
  116.  
  117.   BEGIN (* Render *)
  118.     (* get a pointer to our structure, and check if we actually got it *)
  119.     sep := SYS.VAL (SeperatorPtr, ea.GetAttr (obj, ea.UserData));
  120.     IF sep # NIL THEN
  121.       (* get the container object *)
  122.       group := SYS.VAL (ea.OPTR, ea.GetAttr (obj, ea.Parent));
  123.       ASSERT (group # NIL, 96);
  124.  
  125.       (* get group type *)
  126.       type := ea.GetAttr (group, ea.Type);
  127.       ASSERT (type IN {ea.TYPE_VGROUP, ea.TYPE_HGROUP}, 96);
  128.  
  129.       (* get sizes of the object *)
  130.       ignore := ea.GetAttrs ( obj,
  131.                               ea.Width,     SYS.ADR (width),
  132.                               ea.Height,    SYS.ADR (height),
  133.                               u.done );
  134.  
  135.       (* get offsets of object relative to root (window) *)
  136.       left := ea.GetObjectLeft (rm.root_ptr, obj);
  137.       top := ea.GetObjectTop (rm.root_ptr, obj);
  138.  
  139.       IF Recessed IN sep.flags THEN
  140.         pen1 := sep.shadowPen; pen2 := sep.shinePen
  141.       ELSE
  142.         pen2 := sep.shadowPen; pen1 := sep.shinePen
  143.       END;
  144.  
  145.       x1 := SHORT (left); y1 := SHORT (top);
  146.       IF type = ea.TYPE_VGROUP THEN
  147.         x2 := x1 + SHORT (width) - 1; y2 := y1;
  148.         dx := 0; dy := 1
  149.       ELSE
  150.         x2 := x1; y2 := y1 + SHORT (height) - 1;
  151.         dx := 1; dy := 0
  152.       END;
  153.  
  154.       gfx.Move (rm.rastport_ptr, x1, y1);
  155.       gfx.SetAPen (rm.rastport_ptr, pen1);
  156.       gfx.Draw (rm.rastport_ptr, x2, y2);
  157.       gfx.Move (rm.rastport_ptr, x1 + dx, y1 + dy);
  158.       gfx.SetAPen (rm.rastport_ptr, pen2);
  159.       gfx.Draw (rm.rastport_ptr, x2 + dx, y2 + dy)
  160.     END;
  161.     (* return success *)
  162.     RETURN 0
  163.   END Render;
  164.  
  165. (*************************************************************************
  166. *                                                                        *
  167. * Constructors                                                           *
  168. *                                                                        *
  169. *************************************************************************)
  170.  
  171. PROCEDURE xNewSeperator () : ea.OPTR;
  172.  
  173. <*$ ReturnChk- *>
  174. BEGIN (* xNewSeperator *)
  175.   SYS.SETREG (0,
  176.       ea.NewObject ( ea.TYPE_CUSTOMIMAGE,
  177.           ea.MinSizeMethod, MinSizeHook,
  178.           ea.RenderMethod,  RenderHook,
  179.           ea.UserData,      SYS.REG (8), (* sep *)
  180.           u.more,           SYS.REG (9), (* tags *)
  181.           u.done ))
  182. END xNewSeperator;
  183.  
  184. PROCEDURE [4] NewSeperator* ["EASeperators_xNewSeperator"]
  185.   ( VAR sep [8] : Seperator;
  186.     tags [9]..  : u.Tag )
  187.   : ea.OPTR;
  188.  
  189. PROCEDURE [4] NewSeperatorA* ["EASeperators_xNewSeperator"]
  190.   ( VAR sep [8] : Seperator;
  191.     tags [9]    : u.TagListPtr )
  192.   : ea.OPTR;
  193.  
  194. PROCEDURE InitSeperator*
  195.   ( VAR sep  : Seperator;
  196.     flags    : s.SET32;
  197.     drawInfo : i.DrawInfoPtr );
  198.  
  199. BEGIN (* InitSeperator *)
  200.   sep.flags := flags;
  201.   IF drawInfo # NIL THEN
  202.     sep.shinePen := SHORT (drawInfo.pens [i.shinePen]);
  203.     sep.shadowPen := SHORT (drawInfo.pens [i.shadowPen]);
  204.   ELSE
  205.     sep.shinePen := 2; sep.shadowPen := 1
  206.   END;
  207. END InitSeperator;
  208.  
  209.  
  210. (************************************************************************)
  211.  
  212. <*$ LongVars- *>
  213.  
  214. PROCEDURE Init;
  215. BEGIN (* Init *)
  216.   MinSizeHook := SYS.ADR (hook1); RenderHook := SYS.ADR (hook2);
  217.   u.InitHook (MinSizeHook, SYS.VAL (u.HookFunc, MinSize));
  218.   u.InitHook (RenderHook, SYS.VAL (u.HookFunc, Render));
  219. END Init;
  220.  
  221. BEGIN
  222.   Init
  223. END EASeperators.
  224.